/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package Monitores;

import Threads.ThreadZipMail;
import java.util.ArrayList;
import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
import java.util.logging.Level;
import java.util.logging.Logger;

/**
 * Monitor que controla el acceso al Array con los valores guardados en Base de
 * Datos que serán utilizados para generar PDFs,
 *
 * @author felipe
 */
public class MonitorValoresBdToPDF {

    private ArrayList<String> listaConDatosDelCSV;
    private ArrayList<String> listaValoresAgregadosEnBD;
    private final Lock lock;
    private final Condition noHayValores;
    private int produccion;
    private int numeroThreads;

    public MonitorValoresBdToPDF(int numeroThreads) {
        this.listaConDatosDelCSV = new ArrayList<>();
        this.listaValoresAgregadosEnBD = new ArrayList<>();
        this.lock = new ReentrantLock(true);
        this.noHayValores = lock.newCondition();
        this.produccion = 0;
        this.numeroThreads = numeroThreads;
    }

    /**
     * Introduce un valor para generar PDF.
     *
     * @param valor
     */
    public void putValor(String valor) {
        lock.lock();
        try {
            listaValoresAgregadosEnBD.add(valor);
            noHayValores.signal();
        } finally {
            lock.unlock();
        }
    }

    /**
     * Devuelve un valor para generar una query y crear un PDF.
     *
     * @return
     */
    public String getValor() {
        lock.lock();
        String valorListaBD = null;
        String valorListaCSV = null;
        try {
            if (listaValoresAgregadosEnBD.isEmpty() && produccion != 0) {
                noHayValores.await();
            }
            if (!listaValoresAgregadosEnBD.isEmpty()) {
                valorListaBD = listaValoresAgregadosEnBD.get(0);
                listaValoresAgregadosEnBD.remove(valorListaBD);

                Boolean encontrado = false;
                for (int i = 0; i < listaConDatosDelCSV.size() && !encontrado; i++) {
                    valorListaCSV = listaConDatosDelCSV.get(i);
                    if (valorListaCSV.contains(valorListaBD)) {
                        listaConDatosDelCSV.remove(valorListaCSV);
                        produccion--;
                        encontrado = true;
                    }
                }
            } else {
                noHayValores.signal();
                numeroThreads --;
                if (numeroThreads == 0) {
                    Thread zipMail = new Thread(new ThreadZipMail());
                    zipMail.start();
                }
            }
        } catch (InterruptedException ex) {
            Logger.getLogger(MonitorFicherosDescargados.class.getName()).log(Level.SEVERE, null, ex);
        } finally {
            lock.unlock();
            return valorListaCSV;
        }
    }

    /**
     * Fija el numero total, en principio, de ficheros a guardar en Base de
     * Datos.
     *
     * @param produccion
     */
    public void setProduccion(int produccion) {
        this.produccion = produccion;
    }

    /**
     * Dado un id comprueba que el mismo es parte de una entra obtenida al leer
     * el CSV que se utiliza para generar los PDFs.
     *
     * @param id
     * @return
     */
    public boolean existeValorEnCSV(String id) {
        for (String s : listaConDatosDelCSV) {
            if (s.contains(id)) {
                return true;
            }
        }
        return false;
    }

    /**
     * Agrega un linea leida del CSV que se utiliza para generar los PDFs.
     *
     * @param valor
     */
    public void agregarValorDelCSVALista(String valor) {
        listaConDatosDelCSV.add(valor);
    }
}
